16.3 Auswahlkästchen mit der Klasse »CheckBox«  
Die zweite aus ButtonBase abgeleitete Klasse ist CheckBox. Objekte dieses Typs werden auch als Kontrollkästchen oder Auswahlkästchen bezeichnet. Wird zur Laufzeit auf das Kästchen geklickt, wird im Kästchen ein Häkchen angezeigt, das durch erneutes Klicken entfernt wird.
Die wichtigste Eigenschaft ist demzufolge die, die den Zustand des Kontrollkästchens mit einem booleschen Wert beschreibt: Checked. Der Wert der Eigenschaft gibt an, ob das Kästchen markiert ist (True) oder nicht (False). Eine Änderung der Auswahl hat die Auslösung des Ereignisses CheckedChanged zur Folge. Sie können das Ereignis dazu benutzen, um im Ereignishandler den neuen Zustand des Kästchens zu überprüfen um darauf entsprechend zu reagieren.
| Private Sub checkBox1_CheckedChanged(...)
|
| If chekBox1.Checked Then
|
| ...
|
| Else
|
| ...
|
| End If
|
| End Sub
|
Der Aktivierungszustand wird automatisch umgeschaltet, wenn der Anwender auf das Kontrollkästchen klickt. Wenn Sie das vermeiden wollen, müssen Sie die Eigenschaft AutoCheck auf False setzen. Allerdings sind Sie dann auch in der Pflicht, einen anderen Weg zu finden, der die Umschaltung bewirkt, z. B. im Click-Ereignis des Steuerelements:
| ' Ereignishandler des Click-Ereignisses der Checkbox 'chkBox'
|
| Private Sub checkBox1_Click(...)
|
| chkBox.Checked = Not chkBox.Checked
|
| End Sub
|
Das Fenster im folgenden Beispiel enthält drei Kontrollkästchen, die dazu dienen, den Stil einer Zeichenfolge in einer Textbox in beliebiger Kombination fett, kursiv oder unterstrichen darzustellen.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 16.5 Ausgabe des Beispiels »CheckBoxDemo«
| ' ---------------------------------------------------------
|
| ' Beispiel: ...\Kapitel 16\CheckBoxDemo
|
| ' ---------------------------------------------------------
|
| Public Class Form1
|
| Private Sub Form1_Load(...) Handles MyBase.Load
|
| Dim chkFont(2) As CheckBox
|
| Dim style() As String = {"Fett", "Kursiv", "Unterstrichen"}
|
| For i As Integer = 0 To 2
|
| chkFont(i) = New CheckBox()
|
| chkFont(i).Location = New Point(25, 45 + i * 25)
|
| chkFont(i).Text = style(i)
|
| AddHandler chkFont(i).CheckedChanged, AddressOf CheckboxChanged
|
| Next
|
| Me.Controls.AddRange(chkFont)
|
| End Sub
|
| ' Ereignishandler
|
| Private Sub CheckboxChanged()
|
| Dim fs() As FontStyle = {FontStyle.Bold, _
|
| FontStyle.Italic, FontStyle.Underline}
|
| Dim newFontStyle As FontStyle = 0
|
| For i As Integer = 0 To 2
|
| If CType(Me.Controls(i + 1), CheckBox).Checked Then
|
| newFontStyle = newFontStyle Or fs(i)
|
| End If
|
| Next
|
| TextBox1.Font = New Font(TextBox1.Font, newFontStyle)
|
| End Sub
|
| End Class
|
Bei Auswahlkästchen und den im folgenden Abschnitt beschriebenen Optionsschaltflächen stoßen wir auf ein generelles Problem des Windows Forms-Designers. Enthält eine Form mehrere gleichartige Steuerelemente, stehen diese häufig in einem funktional-logischen Zusammenhang – wie auch in diesem Beispiel. Es bietet sich in solchen Fällen an, diesen Zusammenhang durch ein Steuerelementarray abzubilden. Mit dem Windows Forms-Designer lassen sich jedoch solche nicht erzeugen. Aus diesem Grund werden die Kontrollkästchen im Code des Form-Konstruktors erzeugt.
Dazu wird zuerst ein Array vom Typ CheckBox deklariert, das drei Elemente enthält:
| Dim chkFont(2) As CheckBox
|
Einem zweiten Array vom Typ String werden Zeichenketten zugewiesen, die den Kontrollkästchen als Beschriftung dienen. Alle wesentlichen Eigenschaften der drei Checkboxen können dann in einer Schleife initialisiert werden:
| Dim style() As String = {"Fett", "Kursiv", "Unterstrichen"}
|
| For i As Integer = 0 To 2
|
| chkFont(i) = New CheckBox()
|
| chkFont(i).Location = New Point(25, 45 + i * 25)
|
| chkFont(i).Text = style(i)
|
| AddHandler chkFont(i).CheckedChanged, AddressOf CheckboxChanged
|
| Next
|
Beim Klicken auf eine der drei Checkboxen wird das Ereignis CheckChanged ausgelöst. Der Ereignishandler CheckboxChanged ist so implementiert, dass er sich bei den Ereignissen der drei Checkboxen mit AddHandler registriert. Nach dem Beenden der Schleife wird das CheckBox-Array mit der Methode AddRange der ControlCollection der Form mit
| Me.Controls.AddRange(chkFont)
|
übergeben.
Sehen wir uns nun den Ereignishandler an. Die Mitglieder der Aufzählung FontStyle werden einem Array zugewiesen. Dabei ist zu beachten, dass die Reihenfolge funktionell der des Zeichenfolgearrays style entspricht. Damit gewährleisten wir, dass der Zähler der Schleife als Index des Kontrollkästchenarrays benutzt werden kann und das richtige Element aus dem FontStyle-Array zugeordnet wird.
| Dim fs() As FontStyle = {FontStyle.Bold, FontStyle.Italic, _
|
| FontStyle.Underline}
|
Klickt der Anwender zur Laufzeit auf eines der Kontrollkästchen, wird eine Schleife durchlaufen und der Zustand Checked jedes einzelnen Kontrollkästchens überprüft. Innerhalb der Schleife wird der aktuelle Aktivierungszustand aller Auswahlkästchen abgefragt:
| If CType(Me.Controls(i + 1), CheckBox).Checked Then
|
| ...
|
Dabei muss berücksichtigt werden, dass in der Steuerelementauflistung der Form die Textbox den Index 1 hat, weil sie vor dem CheckBox-Array der ControlsCollection zugewiesen wird.
Abhängig davon, ob das Kontrollkästchen markiert ist oder nicht, werden die entsprechenden Bits in der Variablen newFontStyle vom Typ FontStyle mit
| newFontStyle = newFontStyle Or fs(i)
|
gesetzt und das Ergebnis nach Beendigung der Schleife dem zweiten Parameter des Font-Konstruktors übergeben.
16.3.1 Eigenschaften eines Kontrollkästchens  
Die Beschriftung einer Checkbox erfolgt mit der schon bekannten Eigenschaft Text. Standardmäßig ist das Kästchen im Steuerelement links ausgerichtet, die Beschriftung rechts davon. Über die Eigenschaft CheckAlign kann das Kästchen innerhalb der gesamten Fläche des Steuerelements angeordnet werden:
| Public Property CheckAlign As ContentAlignment
|
Die Aufzählung ContentAlignment haben wir im Zusammenhang mit den Schaltflächen schon behandelt (siehe Tabelle 16.4). Der Standard der Textausrichtung eines Kontrollkästchens ist ContentAlignment.MiddleLeft.
Ebenso lässt auch die Beschriftung mit der Eigenschaft TextAlign ausrichten, die vom gleichen Typ ist wie CheckAlign und damit auch dieselben Einstellungen zulässt. Ist man ein Freund von grafischen Symbolen, bietet sich anstelle der Beschriftung oder auch zusätzlich zu dieser an, der Eigenschaft Image eine Bitmap, ein Icon oder ein Metafile anzugeben und dieses mit ImageAlign auszurichten.
Ein Kontrollkästchen muss sich nicht unbedingt als Kästchen darstellen. Über die Eigenschaft Appearance mit der Einstellung
| checkbox1.Appearance = Appearance.Button
|
kann das Erscheinungsbild auch das einer Schaltfläche sein (der Standard ist Appearance.Normal) Allerdings unterscheidet sich das Verhalten eines so festgelegten Kontrollkästchens von dem eines herkömmlichen Buttons, denn im ausgewählten Zustand bleibt das Kontrollkästchen – besser sollte man jetzt von einem Button sprechen – im gedrückten Zustand. Das entspricht der Einstellung True der Eigenschaft Checked. In Abbildung 16.6 ist das mit checkbox1 beschriftete Steuerelement ausgewählt, das andere nicht.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 16.6 Kontrollkästchen mit der Einstellung »Appearance.Button«
Die Darstellungsarten einer Auswahlschaltfläche
Sie können, wie Sie eben gesehen haben, eine CheckBox sowohl als Auswahlkästchen oder als Schaltfläche anzeigen lassen. Darüber hinaus gestattet die Eigenschaft FlatStyle weitere Stile (siehe auch Tabelle 16.2). Mit der Einstellung FlatStyle=Flat und Appearance=Button wird auch die Eigenschaft FlatAppearance, die Sie schon im Zusammenhang mit den Buttons kennen gelernt haben, wieder interessant. Zusätzlich zu den Eigenschaften, die der Tabelle 16.3 zu entnehmen sind, können CheckBoxen auch eine gewünschte Hintergrundfarbe im ausgewählten Zustand annehmen. Hierzu dient die Eigenschaft CheckedBackColor der Klasse FlatButtonAppearance.
16.3.2 Checkboxen mit drei Aktivierungszuständen  
Bisher haben Sie das Kontrollkästchen als ein Steuerelement kennen gelernt, das die beiden Zustände True und False anzeigt. Manchmal ist jedoch ein Steuerelement dieses Typs erforderlich, das einen »Zwischenzustand« zu beschreibt. Denken Sie beispielsweise an einen markierten Text in einem Textverarbeitungsdokument. In einem Kontrollkästchen, das für die Festlegung der fetten Schrift zuständig ist, wird das Häkchen gesetzt, wenn auch tatsächlich der gesamte markierte Text fett dargestellt wird. Was ist aber, wenn der markierte Text nur teilweise fett geschrieben ist? Das Kästchen deaktiviert zu lassen, spiegelt genauso wenig die Realität wider wie der aktivierte Zustand. Es muss ein Kompromiss in der Darstellung des Kontrollkästchens gefunden werden. Diesem Sonderfall wird mit den beiden Eigenschaften ThreeState und CheckState Rechnung getragen.
Die Eigenschaft ThreeState beschreibt mit einem booleschen Wert, ob das Kontrollkästchen anstatt der üblichen zwei nun drei Aktivierungszustände unterstützt. Der Standard ist False. Um drei mögliche Zustände darzustellen, setzen Sie ThreeState=True. Der aktuelle Zustand des Auswahlkästchens wird danach durch die Eigenschaft CheckState beschrieben, die drei Werte annehmen kann, die mit der gleichnamigen Enumeration beschrieben werden.
Tabelle 16.5 Die Aufzählung »CheckState«
| Member
|
Beschreibung
|
| Unchecked
|
Das Kästchen ist nicht markiert.
|
| Checked
|
Das Kästchen ist markiert.
|
| Intermediate
|
Das Kästchen ist markiert, wird zur Kennzeichnung des Zwischenzustands aber grau hinterlegt.
|
Haben Sie ein Kontrollkästchen, das drei Zustände anzeigen kann, sollten Sie nicht das Ereignis CheckChanged, sondern das Ereignis CheckStateChanged programmieren, das auftritt, wenn sich die CheckState-Eigenschaft ändert.
|